package sys

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"go-web2/app/common/config"
	"go-web2/app/common/util"
	"go-web2/app/model/sys"
	"path/filepath"
	"strings"
	"time"
)

type UserController struct{}

// 获取当前登录的用户
func (UserController) GetLoginUser(c *fiber.Ctx) error {
	// 获取请求中的 Token
	token := c.Get(config.TokenHeader)
	user := sys.GetLoginUser(token)
	user.Password = ""
	if user.Phone != nil {
		phone := util.RSAEncrypt(*user.Phone) // 手机号码加密
		user.Phone = &phone
	}
	result := map[string]any{}
	result["user"] = user
	result["roles"] = user.RoleId
	result["permissions"] = sys.GetPermList(user.RoleId)
	return c.Status(200).JSON(config.Success(result))
}

// 用户列表
func (UserController) GetPage(c *fiber.Ctx) error {
	user := sys.SysUserView{}
	user.UserName = c.Query("code")
	user.RealName = c.Query("name")
	user.AncestorId = c.Query("parentId")
	user.Token = c.Get(config.TokenHeader)
	pageSize := c.QueryInt("pageSize", 10)
	pageNum := c.QueryInt("pageNum", 1)
	return c.Status(200).JSON(config.Success(user.GetPage(pageSize, pageNum)))
}

// 根据id获取用户
func (UserController) GetById(c *fiber.Ctx) error {
	user := sys.SysUser{}
	user.Id = c.Params("id")
	user.Token = c.Get(config.TokenHeader)
	err := user.GetUser()
	if err != nil {
		return c.Status(200).JSON(config.Error("获取用户失败，或没有查看权限"))
	}
	user.Password = ""
	// 这里将数据返回给前端时，应该也需要将电话号码脱敏处理，然后由前端解密获得真实的号码，所以这里不能用rsa加密，不然前端无法解密；
	return c.Status(200).JSON(config.Success(user))
}

// 新增用户
func (UserController) Insert(c *fiber.Ctx) error {
	var user sys.SysUser
	if err := c.BodyParser(&user); err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	//user.Password = util.RSADecrypt(user.Password) // 密码解密
	if user.Password == user.UserName {
		return c.Status(200).JSON(config.Error("密码不可与用户名称相同"))
	}
	pwd, err := util.GetEncryptedPassword(user.Password)
	if err != nil {
		return c.Status(200).JSON(config.Error("密码加密失败"))
	}
	user.Password = pwd
	user.Token = c.Get(config.TokenHeader)
	err = user.Insert()
	if err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	return c.Status(200).JSON(config.Success(nil))
}

// 修改用户
func (UserController) Update(c *fiber.Ctx) error {
	var user sys.SysUser
	if err := c.BodyParser(&user); err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	user.Token = c.Get(config.TokenHeader)
	err := user.Update()
	if err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	return c.Status(200).JSON(config.Success(nil))
}

// 删除用户
func (UserController) Delete(c *fiber.Ctx) error {
	var user sys.SysUser
	if err := c.BodyParser(&user); err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	user.Token = c.Get(config.TokenHeader)
	ids := strings.Split(user.Id, ",")
	if err := user.Delete(ids); err != nil {
		return c.Status(200).JSON(config.Error("删除用户失败"))
	}
	return c.Status(200).JSON(config.Success(nil))
}

// 修改密码
func (UserController) UpdatePassword(c *fiber.Ctx) error {
	// 正常是需要加解密的（没有前端就暂时不先加密解密）
	//newPassword := util.RSADecrypt(c.FormValue("newPassword"))
	//oldPassword := util.RSADecrypt(c.FormValue("oldPassword"))
	//id := util.RSADecrypt(c.FormValue("id"))
	newPassword := c.FormValue("newPassword")
	oldPassword := c.FormValue("oldPassword")
	id := c.FormValue("id")
	var password sys.Password
	password.Id = id
	password.OldPassword = oldPassword
	password.NewPassword = newPassword
	password.Token = c.Get(config.TokenHeader)
	err := password.UpdatePassword()
	if err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	return c.Status(200).JSON(config.Success(nil))
}

// 重置密码
func (UserController) ResetPassword(c *fiber.Ctx) error {
	var user sys.SysUser
	user.Id = c.FormValue("id")
	if user.Id == "" {
		return c.Status(200).JSON(config.Error("用户id不可为空"))
	}
	user.Token = c.Get(config.TokenHeader)
	err := user.ResetPassword()
	if err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	return c.Status(200).JSON(config.Success(nil))
}

// 上传头像
func (UserController) Upload(c *fiber.Ctx) error {
	form, err := c.MultipartForm()
	if err != nil {
		fmt.Println(err)
		return c.Status(200).JSON(config.Error("头像上传失败"))
	}
	// 获取新的文件名
	name := form.File["file"][0].Filename                           // 获取文件名
	suffix := name[strings.LastIndex(name, "."):]                   // 文件后缀：.jpg
	fileName := fmt.Sprintf("%d%s", time.Now().UnixMilli(), suffix) // 新文件名
	// 相对路径：/upload/20231208
	relative := filepath.Join(config.FilePath, time.Now().Format("20060102"))
	// 保存文件
	err = util.SaveFile(form, relative, fileName)
	if err != nil {
		return c.Status(200).JSON(config.Error(err.Error()))
	}
	var user sys.SysUser
	user.Token = c.Get(config.TokenHeader)
	relative = filepath.Join(relative, fileName)
	user.Picture = &relative // 数据库保存相对路径
	user.Upload()            // 保存头像到数据库
	return c.Status(200).JSON(config.Success(relative))
}
